package my.algorithm;

/**
 * 位图实现
 * 1、位图有什么用
 * 2、位图有什么优势
 */
public class BitMap {
    private long[] bits;

    /**
     *
     * @param max 可放入的最大值
     */
    public BitMap(int max) {
        // 相当于(max + 64)/64
        bits = new long[(max + 64) >> 6];
    }

    /**
     * 将v放入位图中
     * @param v
     */
    public void add(int v) {
        // 1、找到要放入的数组下标
        // 2、找到对应下标数值的第几位
        // 3、将该位置为1
        bits[v >> 6] |= (1L << (v & 63));
        bits[v >> 6] |= (1L << (v & 63));
    }

    /**
     * 从位图找那个删除掉v
     * @param v
     */
    public void delete(int v) {
        // 1、找到要删除的数组下标
        // 2、找到对应下标数值的第几位
        // 3、将该位置为0
        bits[v >> 6] &= ~(1L << (v & 63));
    }
    public boolean contains(int v) {
        // 1、找到要删除的数组下标
        // 2、找到对应下标数值的第几位
        // 3、看这一位是不是1
        return (bits[v >> 6] & 1L << (v & 63)) != 0;
    }

    public static void main(String[] args) {
//        System.out.println(128 >> 6);
        BitMap bitMap = new BitMap(255);
        bitMap.add(254);
        System.out.println(bitMap.contains(254));
    }
}
